package com.cskaoyan.basic;


/*
        Thread实现方式一：
            1.继承Thread
            2.重写子类的run方法
            3.创建该子类的对象
            4.启动线程 start()

   注意事项：
    1. 一个Thread类(Thread子类)对象代表一个线程

    2. 为什么我们重写Thread类中的run方法
        ——> 只有Thread run()方法中的代码，才会执行在子线程中
       为了保证，子线程中运行的是我们想要在子线程中运行的代码

    3. 但是，如果想要让代码，在子线程中运行，并非一定，代码要写在run方法方法体中
       对于，定义在该Thread子类中，其他方法方法体中的代码，也可以运行在子线程(
       但前提是，必须在run方法中被调用)

       换句话说，一个方法，被哪个线程中的代码调用，被调用的方法，就运行在，调用它的线程中

    4，启动线程，必须使用start()方法来启动，这样才能是Thread中的run方法运行在子线程中
       如果, 如果通过调用run方法，来执行Thread的run方法代码，这仅仅只是普通的方法调用

    5. 同一个Thread或Thread子类对象(代表同一个线程)，只能被启动一次
       如果，我们要启动多个线程，只能创建多个线程对象，并启动这些线程对象



 */
public class Demo2FirstType {

    public static void main(String[] args) {

        //3. 创建Thread子类对象
        FirstThread firstThread = new FirstThread();

        // 4.启动线程
        firstThread.start();

        // 这里只是普通的方法调用，该run方法运行在，调用它的main线程中
        //firstThread.run();

        // 同一个线程启动多次
        //firstThread.start();

        FirstThread secondThread = new FirstThread();
        secondThread.start();
    }
}

// 1. 定义Thread子类
class FirstThread extends Thread {

    /*
        2. 覆盖父类run方法
        a.如果我们想要让我们自己写的代码，运行在子线程中
        b.必须覆盖父类run方法，run写我们自己代码
     */
    @Override
    public void run() {
        System.out.println("hello, thread");

        // 调用其他方法
        testTread();

    }

    public void testTread() {
        System.out.println("hello, another method");
    }



}
